﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Negocio.Entidades;
using System.Data.SqlClient;
using System.Data;

namespace Negocio.AccesoDatos
{
    public class RifasDAO : AccesoADatos
    {
        
        public RifasDAO() { }

        public static List<Boleta> obtenerBoletas(int numero_socio, int año_boleta)
        {
            SqlCommand cmdCupones = new SqlCommand();
            SqlConnection conCupones = obtenerConexion();
            List<Boleta> boletas = new List<Boleta>();
            try
            {
                cmdCupones.Connection = conCupones;
                cmdCupones.CommandType = CommandType.Text;
                cmdCupones.CommandText = "select bxs.numeroSocio, bxs.registroBoleta, cxb.cuota, cxb.importe, cxb.fechaPagada, cxb.numeroFactura " +
                        " from BoletaxSocio bxs inner join boleta b on bxs.registroboleta=b.registroboleta" +
                        " inner join cuponesxboleta cxb on b.registroBoleta=cxb.registroboleta " +
                        "where bxs.numeroSocio=@numero_socio and b.año_boleta=@año_boleta and b.registroBoleta=@registroBoleta";


                string cadenaBoleta = "select bxs.numeroSocio, b.registroBoleta, b.numeracion, b.año_boleta from BoletaxSocio bxs" +
                    " right outer join boleta b on bxs.registroboleta=b.registroboleta " +
                    "where b.año_boleta=@año_boleta  ";


                if (numero_socio > 0)
                {
                    cadenaBoleta += " and bxs.numeroSocio=@numero_socio order by b.numeracion ";
                }
                SqlParameter pr_socio = new SqlParameter("@numero_socio", numero_socio);
                SqlParameter pr_año = new SqlParameter("@año_boleta", año_boleta);
                SqlDataReader drBoletas = consultarSqlDReader(cadenaBoleta, pr_socio, pr_año);

                while (drBoletas.Read())
                {
                    Boleta boleta = new Boleta();
                    boleta.cupones = new List<Cupon>();
                    if (numero_socio > 0)
                        boleta.numero_socio = int.Parse(drBoletas["numeroSocio"].ToString());
                    boleta.registroBoleta = long.Parse(drBoletas["registroBoleta"].ToString());
                    boleta.numeracion = long.Parse(drBoletas["numeracion"].ToString());
                    boleta.año = int.Parse(drBoletas["año_boleta"].ToString());

                    SqlParameter pr_registroBoleta = new SqlParameter("@registroBoleta", long.Parse(boleta.registroBoleta.ToString()));

                    cmdCupones.Parameters.Add(pr_socio);
                    cmdCupones.Parameters.Add(pr_año);
                    cmdCupones.Parameters.Add(new SqlParameter("@registroBoleta", long.Parse(boleta.registroBoleta.ToString())));
                    SqlDataReader drCupon = cmdCupones.ExecuteReader();
                    while (drCupon.Read())
                    {
                        Cupon c = new Cupon();
                        c.numero_cuota = int.Parse(drCupon["cuota"].ToString());
                        c.registroBoleta = long.Parse(drCupon["registroBoleta"].ToString());
                        c.importe = float.Parse(drCupon["importe"].ToString());
                        if (drCupon["fechaPagada"] != DBNull.Value)
                            c.fechaPagada = DateTime.Parse(drCupon["fechaPagada"].ToString());
                        if (drCupon["numeroFactura"] != DBNull.Value)
                            c.numeroFactura = int.Parse(drCupon["numeroFactura"].ToString());
                        boleta.cupones.Add(c);
                    }
                    drCupon.Close();
                    cmdCupones.Parameters.Clear();
                    boletas.Add(boleta);
                }
                drBoletas.Close();
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message + "Error al cargar las boletas del socio nº " + numero_socio.ToString() + ". ");
            }
            finally
            {
                cerrarConexion(conCupones);
            }
            return boletas;
        }

        public static void grabarBoleta(Boleta b)
        {
            long? id = b.registroBoleta;
            
            SqlCommand cmd = new SqlCommand();           
            SqlTransaction trans = null;
            SqlConnection con= obtenerConexion();

            try
            {
                trans = con.BeginTransaction();
                cmd.Connection = con;                
                cmd.Transaction = trans;
                
                
                cmd.CommandText = "INSERT INTO Boleta (numeracion, año_boleta, descripcion) VALUES(@numeracion, @año_boleta, @descripcion); SELECT @@identity;";
                cmd.Parameters.Add(new SqlParameter("@numeracion", b.numeracion));
                cmd.Parameters.Add(new SqlParameter("@año_boleta", b.año));
                cmd.Parameters.Add(new SqlParameter("@descripcion", b.descripcion));
                if (id != null)
                {
                    //cmd.CommandText = "UPDATE Premios SET nombre = @nombre, descripcion = @descripcion, fecha_compra = @fecha_compra, precio_compra = @precio_compra, id_proveedor= @proveedor WHERE id_premio = @Id";
                    //cmd.Parameters.Add(new SqlParameter("@Id", id));
                    //cmd.ExecuteNonQuery();
                }
                else
                {
                    b.registroBoleta = int.Parse(cmd.ExecuteScalar().ToString());
                    
                }

               
               
                foreach (Cupon item in b.cupones)
                {
                    SqlCommand cmd2 = new SqlCommand();
                    cmd2.Connection = con;
                    cmd2.Transaction = trans;
                    cmd2.CommandText = "INSERT INTO CuponesXBoleta (registroBoleta, cuota, importe) VALUES(@registro, @cuota, @importe);";
                    cmd2.Parameters.Add(new SqlParameter("@registro", b.registroBoleta));
                    cmd2.Parameters.Add(new SqlParameter("@cuota", item.numero_cuota));
                    cmd2.Parameters.Add(new SqlParameter("@importe", item.importe));
                    cmd2.ExecuteNonQuery();
                }
                
                for(int i=0;i<b.numeroParticipante.Length;i++)
                {
                    SqlCommand cmd3 = new SqlCommand();
                    cmd3.Connection = con;
                    cmd3.Transaction = trans;
                    cmd3.CommandText = "INSERT INTO NumerosXBoleta (registroBoleta, numeroParticipante, descripcion) VALUES(@registro, @numeroParticipante, @descripcion);";
                    cmd3.Parameters.Add(new SqlParameter("@registro", b.registroBoleta));
                    cmd3.Parameters.Add(new SqlParameter("@numeroParticipante", int.Parse(b.numeroParticipante[i].ToString())));
                    cmd3.Parameters.Add(new SqlParameter("@descripcion", "año 2015"));
                    cmd3.ExecuteNonQuery();
                }                
                trans.Commit();
                
            }
            catch (SqlException ex)
            {
                if (trans != null)
                    trans.Rollback();
                throw new ApplicationException("Error al ejecutar la transaccion en la Base de Datos " + ex.Message.ToString());
            }
            finally
            {
                cerrarConexion(con);
            }
        }

        internal static DataTable obtenerCuponesDeBoleta(int registroBoleta)
        {
             try
             {
                 string cadena = "select * from CuponesXBoleta where registroBoleta=@registroBoleta";
                 SqlParameter prRegistro = new SqlParameter("@registroBoleta", registroBoleta);
                 return consultarSQL(cadena, prRegistro);
             }
             catch (Exception ex)
             {
                 throw new ApplicationException(ex.Message.ToString());
             }
        }

        public static bool sePuedeNuevaDiagramacion(int año)
        {
            try
            {
                string cadena = "SELECT COUNT(*) FROM Boleta WHERE año_boleta=@año";
                SqlParameter año_p = new SqlParameter("@año", año);
                int cantUsuarios = int.Parse(consultarSQLScalar(cadena, año_p));
                return (cantUsuarios > 0);
            }
            catch (Exception exception)
            {
                throw exception;
            }
 
        }

        public static bool sePuedeDiagramarSorteo(int año)
        {
            try
            {
                string cadena = "SELECT COUNT(*) FROM Sorteo WHERE añoSorteo=@año";
                SqlParameter año_p = new SqlParameter("@año", año);
                int cantUsuarios = int.Parse(consultarSQLScalar(cadena, año_p));
                return (cantUsuarios > 0);
            }
            catch (Exception exception)
            {
                throw exception;
            }
 
        }

        internal static int? grabarFactura(Factura f)
        {
            SqlCommand cmd = new SqlCommand();
            SqlTransaction trans = null;
            SqlConnection con = obtenerConexion();

            try
            {
                trans = con.BeginTransaction();
                cmd.Connection = con;
                cmd.Transaction = trans;
                cmd.CommandType = CommandType.Text;

                cmd.CommandText = "INSERT INTO Factura (id_tipoFactura, fechaFactura, id_tipoIVA, id_tipoPago, numeroSocio, total)" +
                    " VALUES(@id_tipoFactura, @fechaFactura, @id_tipoIVA, @id_tipoPago, @numeroSocio, @total); SELECT @@identity;";
                cmd.Parameters.Add(new SqlParameter("@id_tipoFactura", f.id_tipoFactura));
                cmd.Parameters.Add(new SqlParameter("@fechaFactura", f.fechaFactura));
                cmd.Parameters.Add(new SqlParameter("@id_tipoIVA", f.id_tipoIVA));
                cmd.Parameters.Add(new SqlParameter("@id_tipoPago", f.id_tipoPago));
                cmd.Parameters.Add(new SqlParameter("@numeroSocio", f.numeroSocio));
                cmd.Parameters.Add(new SqlParameter("@total", f.total));

                f.numeroFactura = int.Parse(cmd.ExecuteScalar().ToString());

                cmd.Parameters.Clear();

                SqlCommand cmd2 = new SqlCommand();
                cmd2.Connection = con;
                cmd2.Transaction = trans;
                cmd2.CommandType = CommandType.Text;

                foreach (Cupon item in f.cupones)
                {

                    cmd2.CommandText = " UPDATE CuponesXBoleta SET fechaPagada = @fechaPagada, numeroFactura = @numeroFactura" +
                        " WHERE registroBoleta = @registroBoleta AND cuota = @cuota";
                    cmd2.Parameters.Add(new SqlParameter("@fechaPagada", f.fechaFactura));
                    cmd2.Parameters.Add(new SqlParameter("@numeroFactura", f.numeroFactura));
                    cmd2.Parameters.Add(new SqlParameter("@cuota", item.numero_cuota));
                    cmd2.Parameters.Add(new SqlParameter("@registroBoleta", item.registroBoleta));
                    cmd2.ExecuteNonQuery();
                    cmd2.Parameters.Clear();
                }

                trans.Commit();
                return f.numeroFactura;
            }
            catch (SqlException ex)
            {
                if (trans != null)
                    trans.Rollback();
                throw new ApplicationException("Error al ejecutar la transaccion en la Base de Datos " + ex.Message.ToString());
            }
            finally
            {
                cerrarConexion(con);
            }
        }
    }
}
